package com.third.device.mg.serialport.factory.jiecang.product

import com.third.device.mg.serialport.factory.jiecang.BaseJieCangProduct
import com.third.device.mg.serialport.utils.to2ByteH

/**
 * @Date 2022/3/8
 * Description:
 */
class LiftCabinet : BaseJieCangProduct() {
    override fun productDescribe(): String = "捷昌-厨电产品-智能升降吊柜"
    companion object{
        //默认设备类型
        private const val DEFAULT_DEVICE_TYPE = 0x88.toByte()
    }

    /**
     * 功能指令的基础模板
     * @param functionCode 功能码
     * @param funcData 功能数据
     */
    private fun combineCommand(functionCode:Byte ,funcData :ByteArray):ByteArray{
        val command = ByteArray(funcData.size + 2)
        command[0] = DEFAULT_DEVICE_TYPE
        command[1] = functionCode
        System.arraycopy(funcData , 0 ,command , 2 ,funcData.size)
        return checkKitchenAgreement(command)
    }

    /**
     * 查询协议版本
     * 回复指令：1B
     * 10：即1.0
     */
    fun queryProtocolVersion() = combineCommand(0x01 , byteArrayOf(0))

    /**
     * 查询软件版本
     * 回复指令：3B
     * B1 程序框架版本
     * B2 新增功能升级
     * B3 bug修复
     */
    fun querySoftwareVersion() = combineCommand(0x02 , byteArrayOf(0))


    /**
     * 控制设备
     * 01：续动上运行
     * 02：续动下运行
     * 03：点动上运行
     * 04：点动下运行
     * 05：正常停止
     * 06：急停
     * 07：运行至记忆1
     * 08：运行至记忆2
     * 09：运行至记忆3
     * 0A：运行至记忆4
     *
     * 回复数据
     * 00：执行失败（比如已经最高了又收到上升指令依此类推…）
     * 01：正常执行
     */
    fun controlDevice(type: Byte):ByteArray = combineCommand(0x03 , byteArrayOf(type))


    /**
     * 运行到指定高度 单位mm
     * @param height 单位mm
     * 回复数据
     * 00：执行失败（目标位置距离当前位置太近…）
     * 01：正常执行
     */
    fun runHeight(height:Int)= combineCommand(0x04 , height.to2ByteH())


    /**
     * 记忆位置设置
     * @param func
     * 01：设置上限
     * 02：设置下限
     * 03：设置记忆1
     * 04：设置记忆2
     * 05：设置记忆3
     * 06：设置记忆4
     * 07：取消上限
     * 08：取消下限
     * 09：取消记忆1
     * 0A：取消记忆2
     * 0B：取消记忆3
     * 0C：取消记忆4
     * 0D：取消记忆所有记忆位置
     *
     * 回复数据
     * 00：设置失败
     * 01：设置成功
     */
    fun setFunction(func:Byte) = combineCommand(0x05 , byteArrayOf(func))


    /**
     * 进入复位状态
     */
    fun resetDevice() = combineCommand(0x06 , byteArrayOf(0x01))


    /**
     * 一键复位
     * @param type
     * 00：立即停止复位
     * 01：自动执行复位
     *
     * 回复数据
     * 00：操作失败
     * 01：操作成功
     */
    fun resetOneKeyDevice(type: Byte) = combineCommand(0x07 , byteArrayOf(type))


    /**
     * 控制器锁定
     * @param state
     * 00：解锁控制器
     * 01：锁定控制器
     *
     * @return
     * 回复数据
     * 00：操作失败
     * 01：操作成功
     */
    fun controlLock(state:Byte)  = combineCommand(0x08 , byteArrayOf(state))

    /**
     * 查询设备状态
     *
     * @return
     * 回复设备状态
     * 01：上升中
     * 02：下降中
     * 03：暂停中（正常待机模式）
     * 04：设备处于复位状态
     * 05：设备处于锁定状态
     * 06：设备处于异常状态
     */
    fun queryState() = combineCommand(0x09 , byteArrayOf(0))


    /**
     * 查询设备高度
     * @return
     * 回复查询
     * 00 64：100mm
     * 01 F4：500mm
     * …
     * FF FF:无效数据
     */
    fun queryHeight() = combineCommand(0x0A , byteArrayOf(0))

}